package cn.h8k.hj212.example;

import cn.h8k.hj212.codec.Hj212EntityCodec;
import cn.h8k.hj212.entity.Hj212CpGroup;
import cn.h8k.hj212.entity.Hj212CpItem;
import cn.h8k.hj212.entity.Hj212Data;
import cn.h8k.hj212.entity.Hj212Header;
import cn.h8k.hj212.entity.Hj212Message;
import cn.h8k.hj212.factory.Hj212EntityCodecFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * HJ212协议实体类编解码器使用示例
 */
public class Hj212EntityExample {
    
    public static void main(String[] args) {
        // 示例1：使用默认实体类编解码器
        defaultEntityCodecExample();
        
        // 示例2：使用无CRC校验的实体类编解码器
        noCrcCheckEntityExample();
        
        // 示例3：解析实际协议数据
        parseRealProtocolEntityExample();
    }
    
    /**
     * 使用默认实体类编解码器的示例
     */
    private static void defaultEntityCodecExample() {
        System.out.println("===== 默认实体类编解码器示例 =====");
        
        // 使用工厂创建默认实体类编解码器
        Hj212EntityCodec codec = Hj212EntityCodecFactory.createDefaultCodec();
        
        // 构建数据
        Hj212Data data = new Hj212Data();
        data.setQn("20240709120000123");
        data.setSt("31");
        data.setCn("2011");
        data.setPw("123456");
        data.setMn("V130427GDSJ001");
        data.setFlag("4");
        
        // 创建CP数据组
        List<Hj212CpGroup> cpGroups = new ArrayList<>();
        
        // 第一个CP组 - 数据时间
        Hj212CpGroup cpGroup0 = new Hj212CpGroup(0);
        cpGroup0.addItem(new Hj212CpItem("DataTime", "20240709120000"));
        cpGroups.add(cpGroup0);
        
        // 第二个CP组 - 监测数据
        Hj212CpGroup cpGroup1 = new Hj212CpGroup(1);
        cpGroup1.addItem(new Hj212CpItem("avoc01-Rtd", 0.021));
        cpGroup1.addItem(new Hj212CpItem("avoc01-Flag", "N"));
        cpGroups.add(cpGroup1);
        
        data.setCpGroups(cpGroups);
        
        // 创建消息实体
        Hj212Message message = new Hj212Message();
        message.setData(data);
        
        // 编码
        String encoded = codec.encode(message);
        System.out.println("编码结果: " + encoded);
        
        // 解码
        Hj212Message decoded = codec.decode(encoded);
        System.out.println("解码结果: " + decoded);
        
        // 访问解码后的数据
        Hj212Data decodedData = decoded.getData();
        System.out.println("设备MN: " + decodedData.getMn());
        System.out.println("数据时间: " + decodedData.getCpGroups().get(0).getItemByName("DataTime").getValue());
        System.out.println("avoc01-Rtd: " + decodedData.getCpGroups().get(1).getItemByName("avoc01-Rtd").getDoubleValue());
        System.out.println("avoc01-Flag: " + decodedData.getCpGroups().get(1).getItemByName("avoc01-Flag").getStringValue());
    }
    
    /**
     * 使用无CRC校验的实体类编解码器示例
     */
    private static void noCrcCheckEntityExample() {
        System.out.println("\n===== 无CRC校验实体类编解码器示例 =====");
        
        // 使用工厂创建无CRC校验的实体类编解码器
        Hj212EntityCodec codec = Hj212EntityCodecFactory.createNoCrcCheckCodec();
        
        // 构造一个CRC错误的协议字符串
        String wrongCrcData = "##0131QN=20210730012315231;ST=31;CN=2011;PW=123456;MN=V130427GDSJ001;Flag=4;CP=&&DataTime=20210730012315;avoc01-Rtd=0.021,avoc01-Flag=N&&FFFF\r\n";
        
        try {
            // 解码（不会因为CRC错误而抛出异常）
            Hj212Message decoded = codec.decode(wrongCrcData);
            System.out.println("成功解码CRC错误的数据: " + decoded.getCrc());
        } catch (Exception e) {
            System.out.println("解码失败: " + e.getMessage());
        }
    }
    
    /**
     * 解析实际协议数据示例
     */
    private static void parseRealProtocolEntityExample() {
        System.out.println("\n===== 解析实际协议数据示例 =====");
        
        // 使用工厂创建默认实体类编解码器
        Hj212EntityCodec codec = Hj212EntityCodecFactory.createDefaultCodec();
        
        // 实际的协议数据
        String realData = "##0131QN=20210730012315231;ST=31;CN=2011;PW=123456;MN=V130427GDSJ001;Flag=4;CP=&&DataTime=20210730012315;avoc01-Rtd=0.021,avoc01-Flag=N&&1A40\r\n";
        
        try {
            // 解码
            Hj212Message decoded = codec.decode(realData);
            
            Hj212Data decodedData = decoded.getData();
            System.out.println("协议版本: " + decodedData.getSt());
            System.out.println("命令编码: " + decodedData.getCn());
            System.out.println("设备编码: " + decodedData.getMn());
            
            // 访问CP数据
            List<Hj212CpGroup> cpGroups = decodedData.getCpGroups();
            if (!cpGroups.isEmpty()) {
                Hj212CpGroup firstGroup = cpGroups.get(0);
                System.out.println("数据时间: " + firstGroup.getItemByName("DataTime").getStringValue());
                System.out.println("avoc01-Rtd: " + firstGroup.getItemByName("avoc01-Rtd").getDoubleValue());
                System.out.println("avoc01-Flag: " + firstGroup.getItemByName("avoc01-Flag").getStringValue());
            }
        } catch (Exception e) {
            System.out.println("解码失败: " + e.getMessage());
        }
    }
} 